package com.cskaoyan.javase.oop1._11static._0introduction;

/**
 * 我们需求一种全新的变量,这个变量不再是独属于对象的,而是属于类的,属于被全体类的对象所共享的.
 * 这就是Java代码中,使用static修饰的成员变量,称之为静态成员变量,简称"静态变量"
 *
 * 静态成员变量：
 * 是一种被全体对象共享，属于类的变量，存储在一片能够被全体对象所共享的内存区域。
 * 而不像成员变量一样，存储在对象当中！！
 *
 * static关键字的语法:
 * static关键字能够修饰成员变量,称之为"静态成员变量,静态变量"
 * [访问权限修饰符] static 数据类型 变量名;
 * 静态成员变量的特点:
 *       1.和成员变量一样,静态成员变量也具有默认初始化,也可以显式赋值
 *              而且一样是默认初始化永远最先进行
 *              然后再进行其他赋值(包括显式赋值)
 *       2.静态成员变量不要使用对象名点访问,因为它不是属于对象的
 *              它是属于类的
 *              对象名.访问是错误的
 *              应该使用"类名."访问
 *       3.静态成员变量和对象没有任何关系,不创建对象也能够访问,它是属于类的
 *
 * static关键字也能够修饰成员方法,称之为"静态成员方法,静态方法"
 * [访问权限修饰符] static 返回值类型 方法名(形参列表){
 *   //方法体
 * }
 * 静态成员方的特点:
 *      1.静态成员方法同样属于类,它的调用也不需要创建对象
 *      只需要使用"类名.方法名"即可调用
 *      2.如果是同一个类中的静态方法的调用
 *          "类名."是可以省略的
 *          直接方法名调用.
 *      3.静态方法和成员方法的区别仅在于归属者不同
 *          调用的方式不同
 *          其他的,比如传参,方法体都是差不多的
 *
 * 我们把静态成员变量和静态成员方法，统称为类的静态成员。
 * 类的成员: 类中的成员方法和成员变量.
 *
 * @since 14:54
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class NewDemo {
    public static void main(String[] args) {
        /*JavaStudent s1 = new JavaStudent("张三");
        JavaStudent s2 = new JavaStudent("李四");
        // Static member 'com.cskaoyan.javase.oop1._11static.one.JavaStudent.schoolName' accessed via instance reference
        System.out.println(s1.schoolName);
        s1.schoolName = "C++训练营";
        System.out.println(s2.schoolName);*/
        System.out.println(JavaStudent.schoolName);
        JavaStudent.test();
        test();
    }

    public static void test(){}
}

class JavaStudent {
    String name;
    String gender;
    int age;
    int stuId;
    static String schoolName;

    public JavaStudent(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println("吃完饭就去写代码!");
    }

    public void sleep() {
        System.out.println("你怎么睡得着的?");
    }

    public static void test(){
        System.out.println("hello world!");
    }
}